package com.springboot.frame.web.quartz;

import java.util.Date;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author madman 定时任务管理器 用的方法是quartz原生代码工具实现，并没有与spring无缝集成
 *
 */
public class ManagerJob {
	private static Logger _log = LoggerFactory.getLogger(ManagerJob.class);
	// 1.创建一个SchedulerFactory工厂实例 SchedulerFactoryBean是spring中对应的实体类
	private static SchedulerFactory sf = new StdSchedulerFactory();

	/**
	 * @throws SchedulerException
	 *             开启一个定时任务
	 */
	public static void startJob(ScheduleJobProperties scheduleJob, String merchantNo, int id) throws SchedulerException {
		// SchedulerFactory sf = new StdSchedulerFactory();
		// 2.从工厂中获取调度器实例
		Scheduler scheduler = sf.getScheduler();
		// 3.创建JobDetail
		JobDetail jb = JobBuilder.newJob(scheduleJob.getJobClass()).usingJobData("id", id).usingJobData("merchantNo", merchantNo)
				.withDescription(scheduleJob.getDesc()) // job的描述
				.withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()) // job
																					// 的name和group
				.build();
		// 任务运行的时间，SimpleSchedle类型触发器有效
		long time = System.currentTimeMillis() + 60 * 1000L; // 3秒后启动任务
		Date statTime = new Date(time);
		// 4.创建Trigger
		// 使用SimpleScheduleBuilder或者CronScheduleBuilder
		Trigger trigger = TriggerBuilder.newTrigger()
				// .withDescription("")
				// 给触发器起一个名字和组名
				.withIdentity(scheduleJob.getTriggerName(), scheduleJob.getTriggerGroupName())
				// .withSchedule(SimpleScheduleBuilder.simpleSchedule())
				.startAt(statTime) // 默认当前时间启动"0 0/5 * * * ?"
				.withSchedule(CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())) // 每5分钟执行一次
				.build();
		// 5.注册任务和定时器
		scheduler.scheduleJob(jb, trigger);
		// 6.启动 调度器
		if (!scheduler.isShutdown()) {
			scheduler.start();
		}
		_log.info("启动时间 ： " + new Date() + "    执行定时任务！");

	}

	/**
	 *
	 * @param scheduleJob
	 * @throws SchedulerException
	 */
	public static void removeJob(ScheduleJobProperties scheduleJob) throws SchedulerException {
		Scheduler scheduler = sf.getScheduler();
		TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getTriggerName(), scheduleJob.getTriggerGroupName()); // 通过触发器名和组名获取TriggerKey
		JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); // 通过任务名和组名获取JobKey
		scheduler.pauseTrigger(triggerKey); // 停止触发器
		scheduler.unscheduleJob(triggerKey);// 移除触发器
		scheduler.deleteJob(jobKey); // 删除任务
	}
}
